package com.ideal.manage.esms.util;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

import java.io.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.util.zip.ZipOutputStream;


/**
 * Created by wanghongbo on 2015/3/20.
 */
public class ZipUtil {
    public static String[] unzip(String source, String dist){
        OutputStream os = null;
        InputStream is = null;
        ZipFile zipFile = null;
        List<String> returnList = new ArrayList<String>();
        try {
            zipFile = new ZipFile(source);
            Enumeration entryEnum = zipFile.getEntries();
            if (null != entryEnum) {
                ZipEntry zipEntry = null;
                while (entryEnum.hasMoreElements()) {
                    zipEntry = (ZipEntry) entryEnum.nextElement();
                    if (zipEntry.isDirectory()) {
                        dist = dist + File.separator + zipEntry.getName();
                        continue;
                    }
                    if (zipEntry.getSize() > 0) {
                        returnList.add(dist + File.separator + zipEntry.getName());
                        File targetFile = FileUtil.buildFile(dist + File.separator + zipEntry.getName(), false);
                        os = new BufferedOutputStream(new FileOutputStream(targetFile));
                        is = zipFile.getInputStream(zipEntry);
                        byte[] buffer = new byte[10240];
                        int readLen = 0;
                        while ((readLen = is.read(buffer, 0, 10240)) >= 0) {
                            os.write(buffer, 0, readLen);
                        }
                        os.flush();
                        os.close();
                    } else {
                        FileUtil.buildFile(dist + File.separator + zipEntry.getName(), true);
                    }
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (null != is) {
                    is.close();
                }
                if (null != os) {
                    os.close();
                }
                if(null!=zipFile){
                    zipFile.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return returnList.toArray(new String[returnList.size()]);
    }

    public static void zip(String dist, String...params) throws Exception{
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(new File(dist)));
        for(String item : params) {
            File file = new File(item);
            ZipEntry ze = new ZipEntry(file.getName());
            ze.setSize(file.length());
            ze.setTime(file.lastModified());
            out.putNextEntry(ze);
            InputStream in = new BufferedInputStream(new FileInputStream(file));
            int len = 0;
            byte[] buffer = new byte[1024];
            while (-1 != (len = in.read(buffer))) {
                out.write(buffer, 0, len);
            }
            in.close();
        }
        out.close();
    }

    public static void doCompressFile(String inFileName) {

        try {

            System.out.println("Creating the GZIP output stream.");
            String outFileName = inFileName + ".gz";
            GZIPOutputStream out = null;
            try {
                out = new GZIPOutputStream(new FileOutputStream(outFileName));
            } catch(FileNotFoundException e) {
                System.err.println("Could not create file: " + outFileName);
                e.printStackTrace();
            }


            System.out.println("Opening the input file.");
            FileInputStream in = null;
            try {
                in = new FileInputStream(inFileName);
            } catch (FileNotFoundException e) {
                System.err.println("File not found. " + inFileName);
                e.printStackTrace();
            }

            System.out.println("Transfering bytes from input file to GZIP Format.");
            byte[] buf = new byte[1024];
            int len;
            while((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();

            System.out.println("Completing the GZIP file");
            out.finish();
            out.close();
            new File(inFileName).delete();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void doUncompressFile(String inFileName) {

        try {

            if (!getExtension(inFileName).equalsIgnoreCase("gz")) {
                System.err.println("File name must have extension of \".gz\"");
                System.exit(1);
            }

            System.out.println("Opening the compressed file.");
            GZIPInputStream in = null;
            try {
                in = new GZIPInputStream(new FileInputStream(inFileName));
            } catch(FileNotFoundException e) {
                System.err.println("File not found. " + inFileName);
                System.exit(1);
            }

            System.out.println("Open the output file.");
            String outFileName = getFileName(inFileName);
            FileOutputStream out = null;
            try {
                out = new FileOutputStream(outFileName);
            } catch (FileNotFoundException e) {
                System.err.println("Could not write to file. " + outFileName);
                System.exit(1);
            }

            System.out.println("Transfering bytes from compressed file to the output file.");
            byte[] buf = new byte[1024];
            int len;
            while((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }

            System.out.println("Closing the file and stream");
            in.close();
            out.close();
            new File(inFileName).delete();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }

    }

    /**
     * Used to extract and return the extension of a given file.
     * @param f Incoming file to get the extension of
     * @return <code>String</code> representing the extension of the incoming
     *         file.
     */
    public static String getExtension(String f) {
        String ext = "";
        int i = f.lastIndexOf('.');

        if (i > 0 &&  i < f.length() - 1) {
            ext = f.substring(i+1);
        }
        return ext;
    }

    /**
     * Used to extract the filename without its extension.
     * @param f Incoming file to get the filename
     * @return <code>String</code> representing the filename without its
     *         extension.
     */
    public static String getFileName(String f) {
        String fname = "";
        int i = f.lastIndexOf('.');

        if (i > 0 &&  i < f.length() - 1) {
            fname = f.substring(0,i);
        }
        return fname;
    }

    public static void main(String[] args) throws Exception{
        String source = "C:\\Users\\dell\\Desktop\\huadansql.gz";
        doUncompressFile(source);
    }
}
